home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / bricon / source / bios.asm next >
Assembly Source File  |  1991-10-18  |  13KB  |  781 lines

  1.         .286p
  2. _TEXT        SEGMENT  DWORD PUBLIC 'CODE'
  3. _TEXT        ENDS
  4. _DATA        SEGMENT  WORD PUBLIC 'DATA'
  5. _DATA        ENDS
  6. CONST        SEGMENT  WORD PUBLIC 'CONST'
  7. CONST        ENDS
  8. _BSS        SEGMENT  WORD PUBLIC 'BSS'
  9. _BSS        ENDS
  10. DGROUP        GROUP     _TEXT, CONST,    _BSS,    _DATA
  11.  
  12.         ASSUME  CS: _TEXT, DS: DGROUP, ES: DGROUP
  13.  
  14. extrn        _BIOS_91:NEAR
  15. extrn       _OLD_X:WORD
  16. extrn        _CUR_X:WORD
  17. extrn        _CUR_Y:WORD
  18. extrn        _CUR_OFF2:WORD
  19. extrn        _CUR_SIZE2:WORD
  20. extrn        _CUR_DSP_FLG:BYTE
  21. extrn        _Act_Dsp:BYTE
  22.  
  23. GVRAM        equ    0C000h
  24. CVRAM        equ    0C800h
  25. KVRAM        equ    0CA00h
  26. ANKCG        equ    0CB00h
  27.  
  28. MAX_X        equ    80
  29. MAX_Y        equ    24
  30. MAX_Y2        equ    25
  31. CHRSIZ        equ    16
  32. LINSIZ        equ    16
  33.  
  34. _DATA        segment
  35. consol_path    db    "CON",0            ; コンソ-ルデバイス名
  36. null_path    db    "NUL",0            ; NULデバイス名
  37. _DATA        ends
  38.  
  39. _TEXT        SEGMENT
  40.  
  41. ;*****************************
  42. ;*    Work Vram Eria
  43. ;****************************
  44. dmy_ram        dw    (MAX_X*MAX_Y2) dup(0)
  45. ;*****************************
  46. ;*    割り込みワ-ク
  47. ;*****************************
  48. ds_bak        dw    ?
  49. es_bak        dw    ?
  50. vct_off        dw    ?
  51. vct_seg        dw    ?
  52. ;*********************
  53. ;*    VSYNC
  54. ;*********************
  55. IRQ_CODE     equ    0Bh
  56. VS_TIME        equ    4        ; 画面更新間隔の設定
  57.  
  58. vs_para        db    0,0
  59. vs_off        dw    ?
  60. vs_seg        dw    ?
  61. old_off        dw    ?
  62. old_seg        dw    ?
  63. irq_map        db    0,0,0,0
  64. vs_cnt        db    0
  65.  
  66. int_ent     proc    far
  67.         mov    dx,05CAh
  68.         out    dx,al
  69.         sti
  70.  
  71.         inc    cs:[vs_cnt]
  72.         cmp    cs:[vs_cnt],VS_TIME
  73.         jb    int_rt
  74.         mov    cs:[vs_cnt],0
  75.  
  76.         mov    ds,cs:[ds_bak]
  77.         mov    es,cs:[es_bak]
  78.         cmp    byte ptr [_Act_Dsp],0    ;割り込み禁止フラグ
  79.         jne    int_rt
  80.  
  81.         mov    dx,05C8h
  82.         in    al,dx
  83.         test    al,80h
  84.         jnz    int_go
  85.  
  86.         mov    ah,byte ptr [_CUR_X]
  87.         mov    al,byte ptr [_CUR_Y]
  88.         cmp    ax,[_OLD_X]
  89.         jz    int_rt
  90.  
  91. int_go:        mov    byte ptr [_Act_Dsp],1    ;多重割り込み防止
  92.         call    _cflush
  93.         mov    byte ptr [_Act_Dsp],0
  94.  
  95.         mov    ah,byte ptr [_CUR_X]
  96.         mov    al,byte ptr [_CUR_Y]
  97.         mov    [_OLD_X],ax
  98.  
  99. int_rt:        ret
  100. int_ent     endp
  101.  
  102. vs_set        proc    near
  103.         push    ds
  104.  
  105.         mov    ah,01h
  106.         mov    dl,IRQ_CODE
  107.         int    0AEh
  108.         mov    cs:[old_off],di
  109.         mov    cs:[old_seg],ds
  110.  
  111.         push    cs
  112.         pop    ds
  113.         mov    di,offset int_ent
  114.         mov    cs:[vs_off],di
  115.         mov    cs:[vs_seg],ds
  116.         mov    di,offset vs_para
  117.         mov    ah,00h
  118.         mov    dl,IRQ_CODE
  119.         int    0AEh
  120.  
  121.         mov    ah,03h
  122.         mov    di,offset irq_map
  123.         int    0AEh
  124.         or    byte ptr cs:[di+2],08h
  125.         mov    ah,02h
  126.         int    0AEh
  127.  
  128.         pop    ds
  129.         ret
  130. vs_set        endp
  131.  
  132. vs_reset     proc    near
  133.         push    ds
  134.  
  135.         push    cs
  136.         pop    ds
  137.         mov    ah,03h
  138.         mov    di,offset irq_map
  139.         int    0AEh
  140.         and    byte ptr cs:[di+2],0F7h
  141.         mov    ah,02h
  142.         int    0AEh
  143.  
  144.         mov    di,cs:[old_off]
  145.         mov    ds,cs:[old_seg]
  146.         mov    ah,00h
  147.         mov    dl,IRQ_CODE
  148.         int    0AEh
  149.  
  150.         pop    ds
  151.         ret
  152. vs_reset     endp
  153. ;******************************
  154. ;*    コンソ-ルBIOS(int 91h)
  155. ;******************************
  156. bios_ent     proc    far
  157.         pusha
  158.         push    ds    ;+2
  159.         push    es    ;+0
  160.         sti
  161.         cld
  162.         mov    bp,sp
  163.         mov    ds,cs:[ds_bak]
  164.         mov    es,cs:[es_bak]
  165.         push    ss
  166.         push    bp
  167.         call    _BIOS_91
  168.         add    sp,4
  169.         pop    es
  170.         pop    ds
  171.         popa
  172.         iret
  173. bios_ent     endp
  174. ;**************************************************************
  175. ;
  176. ;    ファイルのリダイレクト処理
  177. ;
  178. ; al    =    ファイルのオ-プンモ-ド
  179. ; bx    =    ファイルパス番号
  180. ; dx    =    NEWデバイスネ-ム
  181. ;
  182. ;**************************************************************
  183. reopen        proc    near
  184.         push    ax
  185.         mov    ah,3Eh                ; CLOSE
  186.         int    21h
  187.         pop    ax
  188.         mov    ah,3Dh                ; OPEN
  189.         int    21h
  190.         ret
  191. reopen        endp
  192. ;*********************************************
  193. ;*    コンソ-ルBIOSベクタ(int 91h) &
  194. ;*    タイマ割り込みの設定
  195. ;*********************************************
  196.         PUBLIC    _setbios
  197. _setbios     PROC     NEAR
  198.         push    ds
  199.         push    es
  200.  
  201.         mov     al,0                ; 標準入出力を
  202.         mov     bx,0                ; コンソ-ルデバイス
  203.         mov    dx,offset DGROUP:consol_path    ; にリダイレクトする
  204.         call    reopen                ; 入力
  205.         mov     al,1                ;
  206.         mov     bx,1                ;
  207.         call    reopen                ; 出力
  208.         mov     al,1                ;
  209.         mov     bx,2                ;
  210.         call    reopen                ; エラ-出力
  211.  
  212.         mov    cs:[ds_bak],ds
  213.         mov    cs:[es_bak],es
  214.  
  215.         mov    ax,3591h        ; int 91h
  216.         int    21h
  217.         mov    ax,es
  218.         mov    cs:[vct_seg],ax
  219.         mov    cs:[vct_off],bx
  220.  
  221.         mov    dx,offset bios_ent
  222.         push    cs
  223.         pop    ds
  224.         mov    ax,2591h        ; int 91h
  225.         int    21h
  226.  
  227.         call    vs_set
  228.  
  229.         pop    es
  230.         pop    ds
  231.         ret    
  232. _setbios     endp
  233. ;***************************************
  234. ;*    ベクタ及び割り込みの解除 & 終了
  235. ;***************************************
  236.         PUBLIC    _resetbios
  237. _resetbios     PROC NEAR
  238.         push    ds
  239.         push    es
  240.  
  241.         mov    al,0                ; 標準入出力を
  242.         mov    bx,0                ; NULにリダイレクト
  243.         mov    dx,offset DGROUP:null_path    ;
  244.         call    reopen                ; 入力
  245.         mov    al,1                ;
  246.         mov    bx,1                ;
  247.         call    reopen                ; 出力
  248.         mov    al,1                ;
  249.         mov    bx,2                ;
  250.         call    reopen                ; エラ-出力
  251.  
  252.         call    vs_reset
  253.  
  254.         mov    ax,cs:[vct_seg]
  255.         mov    ds,ax
  256.         mov    dx,cs:[vct_off]
  257.         mov    ax,2591h
  258.         int    21h
  259.  
  260.         pop    es
  261.         pop    ds
  262.         ret    
  263. _resetbios     endp
  264. ;**********************************************
  265. ;*    colset(char *vram,int color,int byte);
  266. ;**********************************************
  267.         PUBLIC    _colset
  268. _colset        proc    near
  269.         push    bp
  270.         mov    bp,sp
  271.         push    es
  272.         push    di
  273.  
  274.         cld
  275.         mov    ax,CVRAM
  276.         mov    es,ax
  277.         mov    di,[bp+4]
  278.         sub    al,al
  279.         mov    ah,[bp+6]
  280.         mov    cx,[bp+8]
  281.         shr    cx,1
  282.         je    colst1
  283.     rep    stosw
  284.  
  285. colst1:        pop    di
  286.         pop    es
  287.         pop    bp
  288.         ret
  289. _colset        endp
  290. ;*****************************************************
  291. ;*    vramcpy(char *des,char *src,int byte);
  292. ;*****************************************************
  293.         PUBLIC    _vramcpy
  294. _vramcpy     proc    near
  295.         push    bp
  296.         mov    bp,sp
  297.         push    ds
  298.         push    es
  299.         push    di
  300.         push    si
  301.  
  302.         cld
  303.         mov    ax,CVRAM
  304.         mov    ds,ax
  305.         mov    es,ax
  306.         mov    cx,[bp+8]
  307.         shr    cx,1
  308.         je    vfcp1
  309.  
  310.         mov    di,[bp+4]
  311.         mov    si,[bp+6]
  312. ;        mov    byte ptr [_Act_Dsp],1    ;漢字表示が乱れるなら
  313.     rep    movsw
  314.  
  315.         mov    ax,KVRAM
  316.         mov    ds,ax
  317.         mov    es,ax
  318.         mov    di,[bp+4]
  319.         mov    si,[bp+6]
  320.         mov    cx,[bp+8]
  321.         shr    cx,1
  322.     rep    movsw
  323. ;        mov    byte ptr [_Act_Dsp],0    ; このフラグを操作
  324.  
  325. vfcp1:        pop    si
  326.         pop    di
  327.         pop    es
  328.         pop    ds
  329.         pop    bp
  330.         ret
  331. _vramcpy     endp
  332. ;*****************************************************
  333. ;*    vramcpy(char *src,char *des,int byte);
  334. ;*****************************************************
  335.         PUBLIC    _vramrcpy
  336. _vramrcpy     proc    near
  337.         push    bp
  338.         mov    bp,sp
  339.         push    ds
  340.         push    es
  341.         push    di
  342.         push    si
  343.  
  344.         std
  345.         mov    ax,CVRAM
  346.         mov    ds,ax
  347.         mov    es,ax
  348.         mov    cx,[bp+8]
  349.         shr    cx,1
  350.         je    vrcp1
  351.  
  352.         mov    di,[bp+4]
  353.         mov    si,[bp+6]
  354.     rep    movsw
  355.  
  356.         mov    ax,KVRAM
  357.         mov    ds,ax
  358.         mov    es,ax
  359.         mov    di,[bp+4]
  360.         mov    si,[bp+6]
  361.         mov    cx,[bp+8]
  362.     rep    movsw
  363.  
  364. vrcp1:        cld
  365.         pop    si
  366.         pop    di
  367.         pop    es
  368.         pop    ds
  369.         pop    bp
  370.         ret
  371. _vramrcpy     endp
  372. ;*********************************
  373. ;*    int sjisto(int code);
  374. ;*********************************
  375.         PUBLIC    _sjisto
  376. _sjisto     proc    near
  377.         push    bp
  378.         mov    bp,sp
  379.         mov    ax,[bp+4]
  380.         shl    ah,1
  381.         cmp    al,080h
  382.         adc    ax,1f61h
  383.         add    al,7fh
  384.         jc    short knf1
  385.         add    al,0a2h
  386. knf1:        and    ah,7fh
  387.         pop    bp
  388.         ret
  389. _sjisto        endp
  390. ;*************************
  391. ;*    Beep();
  392. ;*************************
  393.         PUBLIC    _Beep
  394. _Beep        proc    near
  395.         push    dx
  396.         push    cx
  397.         mov    dx,0FF98h
  398.         in    al,dx
  399.         mov    cx,5000        ; x 10us
  400.         int    0FDh
  401.         out    dx,al
  402.         pop    cx
  403.         pop    dx
  404.         ret
  405. _Beep        ENDP
  406. ;********************************************
  407. ;*
  408. ;*    AsinKey(int ch,int byte,char *str)
  409. ;*
  410. ;********************************************
  411.         public    _AsinKey
  412. _AsinKey     proc    near
  413.         push    bp
  414.         mov    bp,sp
  415.         push    di
  416.  
  417.         mov    ax,0E00h    ; Assin String
  418.         mov    dx,[bp+4]    ; Key Code
  419.         mov    cx,[bp+6]    ; Str Count
  420.         mov    di,[bp+8]    ; Str Addr
  421.         int    90h        ; Key BIOS
  422.  
  423.         pop    di
  424.         pop    bp
  425.         ret
  426. _AsinKey     endp
  427. ;********************************************
  428. ;*
  429. ;*    KeyBufIns(short int *key,int len)
  430. ;*
  431. ;********************************************
  432.         public    _KeyBufIns
  433. _KeyBufIns     proc    near
  434.         push    bp
  435.         mov    bp,sp
  436.         push    di
  437.  
  438.         mov    ax,0B00h    ; Insert Key Buffer
  439.         mov    cx,[bp+6]    ; Str Count
  440.         mov    di,[bp+4]    ; Str Addr
  441.         int    90h        ; Key BIOS
  442.  
  443.         pop    di
  444.         pop    bp
  445.         ret
  446. _KeyBufIns     endp
  447. ;****************************************
  448. ; Wrt_Ank
  449. ;   al:char ah:attr
  450. ;   cx:x    bx:y
  451. ;****************************************
  452.         align    4
  453. _Wrt_Ank     proc    near
  454.         push    ds
  455.         push    si
  456.         push    es
  457.         push    di
  458.         push    cx
  459.         push    bx
  460.  
  461.         mov    dx,ax
  462.         sub    dh,dh        ; char=>ANKCG address [si]
  463.         shl    dx,4        ; * 16
  464.         mov    si,dx
  465.         mov    di,bx
  466.         add    di,cx
  467.  
  468.         mov    bl,ah
  469.         mov    cl,bl        ;cl
  470.         and    bx,7
  471.  
  472.         test    cl,20h        ;cl
  473.         je    $I147
  474.         or    bl,8        ;at
  475.  
  476. $I147:        test    cl,18h        ;cl
  477.         je    $I148
  478.         dec    bh        ;bk bh=0ffh
  479.  
  480. $I148:        mov    ax,ANKCG
  481.         mov    ds,ax
  482.  
  483.         mov    ax,GVRAM
  484.         mov    es,ax
  485.  
  486.         mov    dx,0FF99h
  487.         mov    al,01h
  488.         out    dx,al
  489.  
  490.         mov    al,0Fh
  491.         mov    dx,0FF81h
  492.         out    dx,al
  493.         mov    cx,80-1
  494.         cmp    al,bl
  495.         je    $Sclr
  496.  
  497.         sub    al,al
  498.  
  499.         REPT    16
  500.         stosb
  501.         add    di,cx
  502.         endm
  503.  
  504.         sub    di,80*16
  505.         mov    al,bl
  506.         out    dx,al
  507.  
  508. $Sclr:        or    bh,bh
  509.         jne    $FF100
  510.  
  511.         REPT    16
  512.         movsb
  513.         add    di,cx
  514.         endm
  515.         jmp    $FF101
  516.  
  517.         align    4
  518. $FF100:        REPT    16
  519.         lodsb
  520.         xor    al,bh
  521.         stosb
  522.         add    di,cx
  523.         endm
  524.  
  525. $FF101:        mov    dx,0FF99h
  526.         xor    al,al
  527.         out    dx,al
  528.  
  529.         pop    bx
  530.         pop    cx
  531.         pop    di
  532.         pop    es
  533.         pop    si
  534.         pop    ds
  535.         ret    
  536. _Wrt_Ank    ENDP
  537. ;************************************
  538. ; Wrt_Kan
  539. ;   dx:漢字(反転注意)    ah:attr
  540. ;   cx:x              bx:y
  541. ;************************************
  542.         align    4
  543. _Wrt_Kan     PROC NEAR
  544.         push    es
  545.         push    di
  546.         push    cx
  547.         push    bx
  548.  
  549.         mov    di,bx
  550.         add    di,cx        ;di=VRAM_Address
  551.         mov    cl,ah
  552.  
  553.         mov    bx,cx
  554.         mov    cx,dx
  555.         xchg    ch,cl
  556.  
  557. ;****** Bug Fix Start *******
  558.         cmp    ch,70h
  559.         jb    Not_Cnv
  560.         cmp    ch,74h
  561.         ja    Not_Cnv
  562.         cmp    cl,60h
  563.         jb    Not_Cnv
  564.         cmp    cl,7Eh
  565.         ja    Not_Cnv
  566.         add    cx,07C0h
  567.         jmp    Cnv_End
  568.  
  569.         align    4
  570. Not_Cnv:    cmp    ch,75h
  571.         je    Ext_Cnv
  572.         cmp    ch,76h
  573.         jne    Cnv_End
  574. Ext_Cnv:    sub    ch,75h
  575.         sub    cl,21h
  576.         mov    al,94
  577.         mul    ch
  578.         xor    ch,ch
  579.         add    ax,cx
  580.         mov    dx,ax
  581.         shr    dx,5     ; dx / 32
  582.         and    ax,1Fh    ; ax % 32
  583.         mov    ch,dl    ; dx * 256
  584.         mov    cl,al
  585.         add    cx,0900h
  586. Cnv_End:
  587. ;******* Bug Fix End ********
  588.  
  589.         xchg    ch,cl
  590.         mov    ax,cx
  591.         mov    cx,bx
  592.         mov    dx,0FF94h
  593.         out    dx,al
  594.         inc    dx
  595.         mov    al,ah
  596.         out    dx,al
  597.  
  598.         mov    bl,cl    ;cl
  599.         and    bx,7
  600.  
  601.         test    cl,20h    ;cl
  602.         je    $I247
  603.         or    bl,8            ;at
  604.  
  605. $I247:        test    cl,18h    ;cl
  606.         je    $I248
  607.         dec    bh            ;bk bh=0ffh
  608.  
  609. $I248:        mov    ax,GVRAM
  610.         mov    es,ax
  611.         mov    al,0Fh
  612.         mov    dx,0FF81h
  613.         out    dx,al
  614.         mov    cx,80-2
  615.         cmp    al,bl
  616.         je    $Sclr_K
  617.  
  618.         sub    ax,ax
  619.  
  620. $F251:        REPT    16
  621.         stosw
  622.         add    di,cx
  623.         endm
  624.  
  625.         sub    di,80*16
  626.         mov    al,bl
  627.         out    dx,al
  628.  
  629. $Sclr_K:    mov    dx,0FF96h+1
  630.         and    bh,bh
  631.         je    $FF200
  632.         jmp    $F277
  633.  
  634.         align    4
  635. $FF200:        REPT    16
  636.         dec    dx
  637.         insb
  638.         inc    dx
  639.         insb
  640.         add    di,cx
  641.         endm
  642.         jmp    $FF201
  643.  
  644.         align    4
  645.  
  646. $F277:        REPT    16
  647.         dec    dx
  648.         in    al,dx
  649.         xor    al,bh
  650.         stosb
  651.         inc    dx
  652.         in    al,dx
  653.         xor    al,bh
  654.         stosb
  655.         add    di,cx
  656.         endm
  657.  
  658. $FF201:        pop    bx
  659.         pop    cx
  660.         pop    di
  661.         pop    es
  662.         ret    
  663. _Wrt_Kan    ENDP
  664. ;*****************************
  665. ; locate
  666. ;*****************************
  667.         PUBLIC    _locate
  668. _locate        proc    near
  669.         push    es
  670.         mov    cx,[_CUR_X]
  671.         mov    bx,[_CUR_Y]
  672.         mov    ax,MAX_X
  673.         mul    bx
  674.         add    ax,cx
  675.         shl    ax,1
  676.         add    ax,offset dmy_ram
  677.         mov    di,ax
  678.         xor    byte ptr cs:[di+1],0FFh
  679.  
  680.         shl    bx,4        ; y *= 16
  681.         add    bx,[_CUR_OFF2]
  682.         mov    ax,80
  683.  
  684.         mul    bx        ; y *= 80
  685.         add    ax,cx        ; y + x
  686.         mov    di,ax
  687.  
  688.         mov    ax,GVRAM
  689.         mov    es,ax
  690.         mov    dx,0FF81h
  691.         mov    al,00000001b
  692.         call    loca_sub
  693.         mov    al,01000010b
  694.         call    loca_sub
  695.         mov    al,10000100b
  696.         mov    al,10000100b
  697.         call    loca_sub
  698.         mov    al,11001000b
  699.         call    loca_sub
  700.         pop    es
  701.         ret    
  702.  
  703. loca_sub:    out    dx,al
  704.         push    di
  705.         mov    cx,[_CUR_SIZE2]
  706.  
  707. loca1:        not    byte ptr es:[di]
  708.         add    di,80
  709.         loop    loca1
  710.         pop    di
  711.         ret
  712. _locate        ENDP
  713. ;***********************************************
  714. ;仮想VRAM部(DMYCON Ver2.03)
  715. ;                             by (山)
  716. ;***********************************************
  717.         public    _cflush
  718. _cflush        proc     near
  719.         push    es
  720.         push    ds
  721.         cld
  722.         mov    ax,CVRAM    ; cp
  723.         mov    ds,ax
  724.         xor    si,si
  725.  
  726.         mov    ax,cs        ; dp
  727.         mov    es,ax
  728.         mov    di,offset dmy_ram
  729.  
  730.         xor    cx,cx        ; x:cx
  731.         xor    bx,bx        ; y:bx
  732.         align    4
  733.  
  734. cf_lp1:        mov    ax,[si]
  735.         test    ah,40h
  736.         je    short cf_ank
  737.  
  738.         mov    dx,[si+2000h]
  739.         cmp    dh,es:[di+0]
  740.         jne    short cf_knj
  741.         cmp    dl,es:[di+2]
  742.         jne    short cf_knj
  743.         cmp    ah,es:[di+1]
  744.         je    short cf_ked
  745.  
  746. cf_knj:        mov    es:[di+1],ah
  747.         mov    es:[di+0],dh
  748.         mov    es:[di+2],dl
  749.         mov    byte ptr es:[di+3],0BFh
  750.         call    _Wrt_Kan
  751. cf_ked:        add    si,4
  752.         add    di,4
  753.         add    cx,2
  754.         jmp    short cf_end
  755.         align    4
  756.  
  757. cf_ank:        cmp    ax,es:[di]
  758.         stosw
  759.         je    short cf_aed
  760.         call    _Wrt_Ank
  761. cf_aed:        add    si,2
  762.         inc    cx
  763.  
  764. cf_end:        cmp    cx,MAX_X
  765.         jb    short cf_lp1
  766.         sub    cx,MAX_X
  767.         add    bx,80*LINSIZ
  768.         cmp    bx,MAX_Y2*80*LINSIZ
  769.         jb    short cf_lp1
  770.  
  771.         pop    ds
  772.         pop    es
  773.         cmp    byte ptr [_CUR_DSP_FLG],0
  774.         jne    short cf_end2
  775.         call    _locate
  776. cf_end2:    ret
  777. _cflush        endp
  778.  
  779. _TEXT        ENDS
  780. END
  781.